#URL短縮など、ツィートの文章を作るときに役立つ機能を提供
require 'rubygems'
require 'json'

#load 'config.rb',true
require 'uri'
require 'net/http'

class TalkClass

	#文字列が長いときは後ろを省略するよ
	def shorten_message(message,limit=140)
		strs = message.split(//u)
		if (limit < strs.length) then
			new_message=strs[0..(limit-4)].join
			return new_message.concat(" (ry")
		end
		return message
	end

	#区切り文字[||]で分割する
	#１文がlimitより長かったら分割
	#分割後の文字数がlowest以下なら省略
	def split_message(message,limit=140,lowest=5)
		lowest=4 if lowest<=4
		messages=Array.new

		#区切り文字[||]で分割
		msgs = message.split('||')

		#分割と省略
		msgs.each do |msg|
			strs = msg.split(//u)
			strlen = strs.length
			#最初からlimit以下ならなんにもしない
			if strlen < limit then
				messages.push(msg)
				next
			#2つ以上に分割できないなら、そのまま省略
			#RTが入ってたら省略
			elsif (strlen < limit+lowest) or /RT / =~ msg then
				messages.push(shorten_message(msg,limit))
				next
			end

			#分割開始
			count=0
			begin
				count+=1
				strs.unshift("[#{count}] ".split(//u))
				strlen = strs.length
				if limit < strlen then
					#のこりがまだ分割できるならぶんかつ
					if ( lowest < (strlen-limit)) then
						part = strs.slice!(0..(limit-1))
						messages.push(part.join)
					else #のこりががlowest文字以下になるなら省略
						messages.push(shorten_message(strs.join,limit))
						break #もう終わり
					end
				else #limit以下になった
					messages.push(strs.join)
					break #もう終わり
				end
			end while strlen > lowest
		end
		return messages
	end


	#文章中のURLを短縮URLと置き換えるよ
	def replace_uri(message,mode='shorten_bitly')
		#bit.lyがおすすめなんだよ
		mode = 'shorten_tinyurl' if(@option['bitly_id']=='' or @option['bitly_key']=='')
		str = message.dup
		URI.extract(message, %w[http https ftp]) do |uri|

			case mode
			when 'shorten_bitly'
				new_uri = bitly_shorten_uri(uri)
			when 'shorten_tinyurl'
				new_uri = tinyurl_shorten_url(uri)
			when 'expand'
				case uri
				when %r(bit.ly|j.mp)
					new_uri = bitly_expand_url(uri)
				when %r(tinyurl.com)
					new_uri = tinyurl_expand_url(uri)
				end
			end
			str.gsub!(uri,new_uri) if(new_uri!=nil)
  	end
  	return str
	end

	#bit.lyを使ってURLを短縮する。ただし、アカウントの設定をしてないときは短縮せずに返す
	def bitly_shorten_uri(long_url='')
		id = @option['bitly_id']
		api_key = @option['bitly_key']
		version = 'v3'
		return long_url if(id=='' or api_key=='' or long_url=='')

		#URLエンコードしとく事
		query = "longUrl=#{URI.encode(long_url)}&login=#{id}&apiKey=#{api_key}&format=json"
		result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/shorten?#{query}"))
		return result['data']['url']  if long_url == result['data']['long_url']
		return long_url
	end

	#bitlyで短縮したURLを元に戻す
	def bitly_expand_url(short_url)
		id = @option['bitly_id']
		api_key = @option['bitly_key']
		version = 'v3'
		return short_url if(id=='' or api_key=='')
	
		#URLエンコードしとく事
		query = "shortUrl=#{URI.encode(short_url)}&login=#{id}&apiKey=#{api_key}&format=json"
		result = JSON.parse(Net::HTTP.get("api.bit.ly", "/#{version}/expand?#{query}"))
		return result['data']['expand'][0]['long_url']  if short_url == result['data']['expand'][0]['short_url']
		return short_url
	end

	#tinyurlで短縮する
	def tinyurl_shorten_url(long_url)
		query = "url=#{URI.encode(long_url)}"
		result = Net::HTTP.get("tinyurl.com", "/api-create.php?#{query}")
		return result
	end

	#TinyURLで短縮したURLを元に戻す。
	#TinyURLは公式では短縮URLの復元を行ってない。。。
	#http://d.hatena.ne.jp/os0x/20090215/1234686704
	def tinyurl_expand_url(short_url)
		query = "url=#{URI.encode(short_url)}"
		result = JSON.parse(Net::HTTP.get("ss-o.net", "/api/reurl.json?#{query}"))
		return result['url'] if result['url']!=nil
		return short_url
	end
end
